#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Autor: Joao Alturas, 6197
# Data: 2014-11-29
import wx
import csv
import sys
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt
import xlrd
from pylab import *
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String, Float, func
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///treta1.db')
Base = declarative_base()

"""
#Classe Dados base
#integer ano
#float ipcGlobal
#float varAnualTaxInfl     
#float remMinMensal  
#float remMaxMensal 
#float pibPercapitAnual 
#float rendNacBrutPercAnual  
#float rendDispBrutPercAnual 
#float remunPercapitAnual 
"""
class Dados(Base):
    
    __tablename__ = 'dados' 
    id = Column(Integer, primary_key=True)
    ano = Column(Integer)
    ipcGlobal = Column(Float)    
    varAnualTaxInfl = Column(Float)     
    remMinMensal = Column(Float)   
    remMaxMensal = Column(Float) 
    pibPercapitAnual = Column(Float) 
    rendNacBrutPercAnual = Column (Float)  
    rendDispBrutPercAnual = Column (Float)  
    remunPercapitAnual = Column (Float) 
#Declaração da função init 
#Inicialização das variáveis  
    def __init__(self,ano,ipcGlobal,varAnualTaxInfl,remMinMensal,remMaxMensal,
        pibPercapitAnual,rendNacBrutPercAnual,rendDispBrutPercAnual,remunPercapitAnual):
                                             
            self.ano = int(ano)
            try:
                self.ipcGlobal = float(ipcGlobal)   
            except:
                self.ipcGlobal = 0
            try: 
                self.varAnualTaxInfl = float(varAnualTaxInfl)
            except:
                self.varAnualTaxInfl = 0
            try:
                self.remMinMensal = float(remMinMensal)
            except:
                self.remMinMensal = 0
            try:
                self.remMaxMensal = float(remMaxMensal)
            except:
                self.remMaxMensal= 0
            try:
                self.pibPercapitAnual = float(pibPercapitAnual)
            except:
                self.pibPercapitAnual = 0
            try:
                self.rendNacBrutPercAnual = float(rendNacBrutPercAnual)
            except:
                self.rendNacBrutPercAnual = 0
            try:
                self.rendDispBrutPercAnual = float(rendDispBrutPercAnual)
            except:
                self.rendDispBrutPercAnual = 0
            try:
                self.remunPercapitAnual = float(remunPercapitAnual)
            except:
                self.remunPercapitAnual = 0
                
         
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

"""
#Classe MyDialog wx.Dialog
#param panel
#param combobox
#param botton Close
#param botton Sair

"""		
        
class MyDialog(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, size=(500, 400))  
        #self.panel = wx.Panel(self, -1, (50, 150), (800, 600),  style=wx.SUNKEN_BORDER)
        #self.plot = wx.StaticBitmap(self.panel)
        dados = ['Indice Preco ao Consumidor',
                   'Variação Anual Taxa Inflação',
                   'Remuneração Miníma Mensal',
                   'Remuneração Máxima Mensal',
                   'pib Percapita Anual',
                   'Rendimento Nacional Bruto Percapita Anual',
                   'Rendimento Disp Bruto Percapita Anual',
                   'Remuneração Percapita Anual' ]
        self.label = wx.StaticText(self, -1, "ESCOLHA O ANO INICIO E FIM DA ESTATISTICA:", pos=(100,30))
        caixa = wx.ComboBox(self, -1, pos=(200, 100),size=(250, -1), choices=dados, style=wx.CB_READONLY)
        self.label = wx.StaticText(self, -1, "ESCOLHA A ESTATISTICA:", pos=(30, 100))
        anos = [ u'1977',u'1978',u'1979',u'1980',u'1981',u'1982',u'1983',u'1984',u'1985',u'1986',
                 u'1987',u'1988',u'1989',u'1990',u'1991',u'1992',u'1993',u'1994',u'1995',u'1996',
                 u'1997', u'1998',u'1999', u'2000',u'2001',u'2002',u'2003',u'2004',u'2005',u'2006',
                 u'2007',u'2008',u'2009', u'2010',u'2011',u'2012',u'2013']
        wx.Button(self, 1, 'Close', (200, 340))
        wx.Button(self, 1, 'Sair', (350, 340))
        wx.Button(self, 2, 'Clear', (50, 340))
        self.label = wx.StaticText(self, -1,"ANO INICIO:",pos=(100, 50))
        self.cx_inicio = wx.ComboBox(self, -1,pos=(180, 50),size=(70,-1), choices=anos, style=wx.CB_READONLY)        
        self.label = wx.StaticText(self, -1,"ANO FIM:",pos=(300, 50))
        self.cx_fim = wx.ComboBox(self, -1,pos=(370, 50),size=(70, -1), choices=anos, style=wx.CB_READONLY)        
        self.Bind(wx.EVT_BUTTON, self.OnClose, id=1)
        self.Bind(wx.EVT_BUTTON, self.OnClear, id=2)
        self.Bind(wx.EVT_COMBOBOX, self.OnSelect, caixa)
        self.Centre()
        
    def OnClose(self, event):
        self.Close()
               
    def OnSair(self, event):
        self.Sair()
        
    def OnClear(self, event):
        self.Clear()
 
    def OnSelect(self, event):
        item = event.GetSelection()
        output = Plotter(item, self.cx_inicio.GetStringSelection(), self.cx_fim.GetStringSelection())
        

"""
#Classe Plotter
#Declaração da função init
#Inicilaização da função
#cx_inicio
#cx_fim
#As várias opções das estatisticas
"""	       

class Plotter:
    def __init__(self, type, inicio, fim):
        self.inicio = inicio
        self.fim = fim
        options = {
            0 : self.ipc,
            1 : self.vti,
            2 : self.rmin,
            3 : self.rmax,
            4 : self.ppa,
            5 : self.rnb,
            6 : self.rdb,
            7 : self.rpa}
        options[type]()
        
####  Defenicao da funcao ipc ###
####  Pesquisa de dados e anos na bd ###
####  Grafico Indice de Preços ao Consumidor ###
	

    def ipc(self):
        limites = session.query(func.max(Dados.ipcGlobal).label("maximo"),
                                func.min(Dados.ipcGlobal).label("minimo")).one()
        dados = session.query(Dados.ano, Dados.ipcGlobal).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        anos =[x.ano for x in dados]
        ipc = [x.ipcGlobal for x in dados]
        plot(anos,ipc)
        grid()
        title(u'Indice de precos ao Consumidor (IPC)')
        xlabel(u'Anos')
        ylabel(u'Indice de Preços ao Consumidor')
        show()
                
####  Defenicao da funcao vti ###
####  Pesquisa de dados e anos na bd ###
####  Grafico Variação Anual da Taxa de Inflação ###

    def vti(self):
        dados = session.query(Dados.ano, Dados.varAnualTaxInfl).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.varAnualTaxInfl).label("maximo"), func.min(Dados.varAnualTaxInfl).label("minimo")).one()
        anos =[x.ano for x in dados]
        vati = [x.varAnualTaxInfl for x in dados]
        plot(anos,vati)
        grid()
        title(u'Variação Anual da Taxa de Inflação' )
        xlabel(u'Anos')
        ylabel(u'Variação Anual da Taxa de Inflação')
        show()
        
####  Defenicao da funcao remMinMensal ###
####  Pesquisa de dados e anos na bd ###
####  Grafico Remuneração Mínima Mensal ###
        
    def rmin(self):
        dados = session.query(Dados.ano, Dados.remMinMensal).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.remMinMensal).label("maximo"), func.min(Dados.remMinMensal).label("minimo")).one()
        rmmesal = session.query(Dados.remMinMensal).all()
        anos =[x.ano for x in dados]
        rmmesal = [x.remMinMensal for x in dados]
        plot(anos,rmmesal)
        grid()
        title(u'Remuneração Mínima Mensal')
        xlabel(u'Anos')
        ylabel(u'Remuneração Mínima Mensal')
        show()
        
####  Defenicao da funcao remMaxMensal ###
####  Pesquisa de dados e anos na bd ###
####  Grafico Remuneração Maxima Mensal ###
        
    def rmax(self):
        dados = session.query(Dados.ano, Dados.remMaxMensal).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.remMaxMensal).label("maximo"), func.min(Dados.remMaxMensal).label("minimo")).one()
        anos =[x.ano for x in dados]
        rmaxmesal = [x.remMaxMensal for x in dados]
        plot(anos,rmaxmesal)
        grid()
        title(u'Remuneração Maxima Mensal')
        xlabel(u'Anos')
        ylabel(u'Remuneração Maxima Mensal')
        show()

####  Defenicao da funcao pibPercapitAnual ###
####  Pesquisa de dados e anos inicio e fim na bd ###
####  Grafico Produto Interno Bruto Percapita Anual ###

    
    def ppa(self):
        dados = session.query(Dados.ano, Dados.pibPercapitAnual).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.pibPercapitAnual).label("maximo"), func.min(Dados.pibPercapitAnual).label("minimo")).one()
        anos =[x.ano for x in dados]
        pibPerCAnual = [x.pibPercapitAnual for x in dados]
        plot(anos,pibPerCAnual)
        grid()
        title(u'Produto Interno Bruto Percapita Anual')
        xlabel(u'Anos')
        ylabel(u'Produto Interno Bruto Percapita Anual')
        show()

####  Defenicao da funcao rendNacBrutPercAnual ###
####  Pesquisa de dados e anos inicio e fim na bd ###
####  Grafico Rendimento Nacional Bruto Percapita Anual ###
		
    def rnb(self):
        dados = session.query(Dados.ano, Dados.rendNacBrutPercAnual).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.rendNacBrutPercAnual).label("maximo"), func.min(Dados.rendNacBrutPercAnual).label("minimo")).one()
        anos =[x.ano for x in dados]
        reNaBrPeAnual = [x.rendNacBrutPercAnual for x in dados]
        plot(anos,reNaBrPeAnual)
        xlabel(u'Anos')
        ylabel(u'Rendimneto Nacional Bruto Percapita Anual')
        grid()
        title(u'Rendimento Nacional Bruto Percapita Anual')
        show()
        
####  Defenicao da funcao rendDispBrutPercAnual ###
####  Pesquisa de dados e anos inicio e fim na bd ###
####  Grafico Rendimento Disponível Bruto Percapita Anual ### 
  
    def rdb(self):
        dados = session.query(Dados.ano, Dados.rendDispBrutPercAnual).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.rendDispBrutPercAnual).label("maximo"), func.min(Dados.rendDispBrutPercAnual).label("minimo")).one()
        anos =[x.ano for x in dados]
        renDisBrPercAnual = [x.rendDispBrutPercAnual for x in dados]
        plot(anos,renDisBrPercAnual)
        xlabel(u'Anos')
        ylabel(u'Rendimneto Disponível Bruto Percapita Anual')
        grid()
        title(u'Rendimento Disponível Bruto Percapita Anual')
        show()
        
####  Defenicao da funcao remunPercapitAnual ###
####  Pesquisa de dados e anos inicio e fim na bd ###
####  Grafico Remuneração Percapita Anual ###    
    
    def rpa(self):
        dados = session.query(Dados.ano, Dados.remunPercapitAnual).filter(Dados.ano >= self.inicio, Dados.ano <= self.fim)
        limites = session.query(func.max(Dados.remunPercapitAnual).label("maximo"), func.min(Dados.remunPercapitAnual).label("minimo")).one()
        anos =[x.ano for x in dados]
        remPercAnual = [x.remunPercapitAnual for x in dados]
        plot(anos,remPercAnual)
        xlabel(u'Anos')
        ylabel(u'Remuneração Percapita Anual')
        grid()
        title(u'Remuneração Percapita Anual')
        show()
    
class MyApp(wx.App):
    def OnInit(self):
        dlg = MyDialog(None, -1, 'IPC GLOBAL ESTATISTICAS')
        dlg.ShowModal()
        dlg.Destroy()
        return True
  
app = MyApp(0)
app.MainLoop()
